//待审批数据
const router = require('koa-router')()
const Leave = require('../model/leavesSchema.js')
const Dept = require('../model/deptSchema.js')
const utils = require('../utils/utils.js')
//设置路由前缀
router.prefix('/leaves')

//列表渲染 get 上传 POST 修改PUT或者POST 删除delete或者POST  RESTFUL风格语法
//如果是POST请求 获取前端发送的参数 ctx.request.body
//如果是GET请求 获取前端发送的参数 ctx.request.query
//ctx.body是返回给前端的数据
//方法的后面 第一个参数都是查询条件 第二个参数基本上都是返回条件
//{userPwd:0} 作为返回条件 0代表不返回  1代表返回 {}或者null代表全部返回 'userName userEmail'代表挑选返回
//$inc 自增加  $or或者  $in包含   $all所有




//待审批列表查询渲染
router.get('/list', async (ctx) => {
    //解构出前端发送过来的数据  applyState=>审批状态(1:待审批,2:审批中,3:审批通过,4:审批拒绝,5:作废)
    let { applyState, type } = ctx.request.query
    //获取当前申请人的token值 解密token
    const authorization = ctx.request.header.authorization
    //调用解密方法
    let { data } = utils.decoded(authorization)
    //调用分页方法
    let { page, skipIndex } = utils.pager(ctx.request.query)
    try {
        let params = {}
        //判断是管理员还是普通用户
        if (type == 'approve') {
            //如果是管理员 能看到自己的申请和下面员工的申请
            if (applyState == 1 || applyState == 2) {//两种状态  1：待审批  2：审批中
                // params.$or = [{ applyState: 1 }, { applyState: 2 }]
                params.curAuditUserName = data.userName;//当前审批人
                params.applyState = applyState;//审批状态
            } else if (applyState > 2) {//三种状态 3：审批通过 4：审批拒绝 5：作废
                params = { "auditFlows.userId": data.userId, applyState }
            } else {
                params = { "curAuditUserName": data.userName }//当前审批人
            }
        } else {
            //如果是普通用户 能看到自己的申请
            params = { "applyUser.userId": data.userId }//查询自己的数据
            if (applyState) {
                params.applyState = applyState//自己的审批状态
            }
        }
        //查询所有数据
        let query = Leave.find(params)
        // skip跳过几条   limit限制返回条数
        let list = await query.skip(skipIndex).limit(page.pagesize)
        // 查询总条数   countDocuments用于计算与选择标准匹配的文档总数量
        let total = await Leave.countDocuments(params)
        ctx.body = utils.success({ list, total })
    } catch (error) {
        console.log(error);
    }
})
//待审批列表创建/作废
router.post('/operate', async (ctx) => {
    let { _id, action, ...params } = ctx.request.body//解构出前端发送过来的数据
    let authorization = ctx.request.header.authorization//获取请求头
    let { data } = utils.decoded(authorization)//解密请求头里的token    解密后的data是用户信息
    // applyState=>审批状态(1:待审批,2:审批中,3:审批通过,4:审批拒绝,5:作废)
    params.applyState = 1//审批状态(默认待审批)
    try {
        if (action === 'create') {
            let total = await Leave.countDocuments()//countDocuments()查询总条数
            params.orderNo = 'XJ' + utils.formatDate(new Date(), 'YYYYMMDD') + total//设置自定义订单号
            //提交人
            params.applyUser = {
                userId: data.userId,
                userName: data.userName,
                userEmail: data.userEmail
            }
            //当前审批人
            if (data.deptId.length == 2) {//中层小领导
                var id = data.deptId.slice(0, 1)//取出第一个元素
            } else {//底层小牛马
                var id = data.deptId[data.deptId.length - 2]
            }
            //查询当前审批人信息
            let userData = await Dept.findById(id)
            params.curAuditUserName = userData.userName//设置当前审批人名字
            let auditUsers = userData.userName//第一个审批人
            //审批流程
            params.auditFlows = [{
                userId: userData.userId,
                userName: userData.userName,
                userEmail: userData.userEmail,
            }]
            //查询人事部门和财务部门主管信息
            let userList = await Dept.find({ deptName: { $in: ['人事部门', '财务部门'] } })
            //位置做调换
            let temp = userList[0]
            userList[0] = userList[1]
            userList[1] = temp
            //审批流程
            userList.forEach(item => {
                params.auditFlows.push({
                    userId: item.userId,
                    userName: item.userName,
                    userEmail: item.userEmail,
                })
                auditUsers += ',' + item.userName//添加审批人做拼接
            })
            params.auditUsers = auditUsers//设置审批人
            params.createTime = new Date()
            //审批日志  不审批不产生日志
            params.auditLogs = []
            //创建数据
            let res = await Leave.create(params)
            ctx.body = utils.success({ data: `申请成功`, msg: 'ok', code: 200 })
        } else {
            //作废
            params.applyState = 5//审批状态(默认作废)
            let res = await Leave.findByIdAndUpdate(_id, params)//更新数据
            ctx.body = utils.success({ data: `作废成功`, msg: 'ok', code: 200 })
        }
    } catch (error) {
        console.log(error);
    }
})
//待审批列表通过/驳回
router.post('/approve', async (ctx) => {
    //解构出前端发送过来的数据
    let { _id, action, remark } = ctx.request.body
    let authorization = ctx.request.header.authorization//获取请求头
    let { data } = utils.decoded(authorization)//解密请求头里的token    解密后的data是用户信息
    console.log('dataaaaaaaaaaaaaaa', data);

    try {
        const params = {}
        //查询审批人信息
        const doc = await Leave.findById(_id)
        //申请驳回
        if (action == 'refuse') {
            params.applyState = 4//审批状态(默认驳回)
            let res = await Leave.findByIdAndUpdate(_id, params)//更新数据
            ctx.body = utils.success({ data: `驳回成功`, msg: 'ok', code: 200 })
        } else if (doc.auditFlows.length == doc.auditLogs.length + 1) {//审批流的长度等于审批日志的长度+1才是全部通过(那个1是当前审批人)
            //审批通过(全部通过)
            params.applyState = 3//审批状态(默认通过)
            doc.auditLogs.push({//添加一条审批日志
                userId: data.userId,
                userName: data.userName,
                remark: remark,//备注
                action: action == 'refuse' ? '驳回' : '通过',//审批通过或拒绝
                createTime: utils.formatDate(new data()) //日志时间
            })
            params.auditLogs = doc.auditLogs//设置审批日志
            let res = await Leave.findByIdAndUpdate(_id, params)//更新数据
            ctx.body = utils.success({ data: `审核全部通过`, msg: 'ok', code: 200 })
        } else if (doc.auditFlows.length > doc.auditLogs.length) {//固定审批流程>当前审批日志的长度
            //审批通过(当前审批通过 继续下一位审批人)
            params.applyState = 1//审批状态(默认待审批)
            params.curAuditUserName = doc.auditFlows[doc.auditLogs.length + 1].userName//设置当前审批人名字
            doc.auditLogs.push({//添加一条审批日志
                userId: data.userId,
                userName: data.userName,
                remark: remark,//备注
                action: action == 'refuse' ? '驳回' : '通过',//审批通过或拒绝
                createTime: utils.formatDate(new Date(), 'YYYY-MM-DD') //日志时间
            })
            params.auditLogs = doc.auditLogs//设置审批日志
            let res = await Leave.findByIdAndUpdate(_id, params)//更新数据
            ctx.body = utils.success({ data: `审核通过`, msg: 'ok', code: 200 })
        }


    } catch (error) {
        console.log(error);
    }
})






module.exports = router
